﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using negocio.entidades;
using negocio.readOnly;
using negocio.servicios;
using System.Text.RegularExpressions;

namespace web.form
{
    public partial class Empleados : System.Web.UI.Page
    {

        private enum State { Agregar, Editar, Ver }

        private EmpleadoService empleadoService = new EmpleadoService();
        private CiudadService ciudadService = new CiudadService();
        private ProvinciaService provinciaService = new ProvinciaService();
        private TipoDocumentoService tipoDocumentoService = new TipoDocumentoService();


        #region EVENTOS

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                pnlGrilla.Visible = true;
                pnlFormulario.Visible = false;
                CargarCombos();
                CargarGrilla();
            }

        }

        protected void btn_agregar_Click(object sender, EventArgs e)
        {
            Session["estado"] = State.Agregar;
            pnlFormulario.Visible = true;
            pnlGrilla.Visible = false;
            if (!txtNombre.Enabled)
            {
                HabilitarCampos();
                btnAceptar.Visible = true;
                btnCancelar.Text = "Cancelar";
            }
            cmdCiudad.Enabled = false;
            LimpiarCampos();
            txtFechaAlta.Text = DateTime.Today.ToShortDateString();
            txtFechaAlta.ReadOnly = true;
            valRanFechaNac.MinimumValue = DateTime.Today.ToShortDateString();
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            if (EsValido())
            {
                pnlFormulario.Visible = false;
                pnlGrilla.Visible = true;
                Guardar();
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            pnlFormulario.Visible = false;
            pnlGrilla.Visible = true;
        }

        protected void btn_editar_Click(object sender, EventArgs e)
        {
            Session["estado"] = State.Editar;
            pnlFormulario.Visible = true;
            pnlGrilla.Visible = false;

            if (!txtNombre.Enabled)
            {
                HabilitarCampos();
                btnAceptar.Visible = true;
                btnCancelar.Text = "Cancelar";
            }

            if (grdEmpleados.SelectedDataKey != null)
            {
                Empleado empleado = empleadoService.ObtenerPorId(Convert.ToInt32(grdEmpleados.SelectedDataKey.Value));
                MapEmpleadoToForm(empleado);
                cmbProvinciaNacimiento_SelectedIndexChanged(sender, e);
                cmdCiudad.SelectedValue = Convert.ToString(empleado.IdCiudad);
            }
            else
            {
                Show("Debe seleccionar un elemento de la grilla");
            }
        }

        protected void btn_ver_Click(object sender, EventArgs e)
        {
            Session["estado"] = State.Ver;
            pnlFormulario.Visible = true;
            pnlGrilla.Visible = false;

            DeshabilitarCampos();
            btnAceptar.Visible = false;
            btnCancelar.Text = "Volver";

            if (grdEmpleados.SelectedDataKey != null)
            {
                Empleado empleado = empleadoService.ObtenerPorId(Convert.ToInt32(grdEmpleados.SelectedDataKey.Value));
                cmbProvinciaNacimiento.SelectedValue = empleado.GetCiudad().IdProvincia.ToString();
                cmbProvinciaNacimiento_SelectedIndexChanged(sender, e);
                cmdCiudad.SelectedValue = Convert.ToString(empleado.IdCiudad);
                cmdCiudad.Enabled = false;
                MapEmpleadoToForm(empleado);
            }
            else
            {
                Show("Debe seleccionar un elemento de la grilla");
            }
        }

        protected void btn_eliminar_Click(object sender, EventArgs e)
        {
            empleadoService.Eliminar(Convert.ToInt32(grdEmpleados.SelectedValue));
            CargarGrilla();
        }

        protected void btnFiltrar_Click(object sender, EventArgs e)
        {
            if (txtBuscarNombre.Text != "")
            {
                List<EmpleadoReadOnly> listaReadOnlies = empleadoService.ObtenerReadOnliesPorNombre(txtBuscarNombre.Text);
                CargarGrilla(listaReadOnlies);
            }
        }

        protected void cmbProvinciaNacimiento_SelectedIndexChanged(object sender, EventArgs e)
        {
            cmdCiudad.Enabled = true;
            cmdCiudad.DataSource = ciudadService.ObtenerPorProvincia(Convert.ToInt32(cmbProvinciaNacimiento.SelectedValue));
            cmdCiudad.DataTextField = "Nombre";
            cmdCiudad.DataValueField = "Id";
            cmdCiudad.DataBind();
        }


        protected void chkDadosBaja_CheckedChanged(object sender, EventArgs e)
        {
            if (chkDadosBaja.Checked)
            {
                CargarGrilla(empleadoService.ObtenerTodosReadOnly());
            }
            else
            {
                CargarGrilla();
            }
        }

        protected void grdEmpleados_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdEmpleados.PageIndex = e.NewPageIndex;
            CargarGrilla();
        }

        #endregion

        #region SOPORTE

        private void Guardar()
        {
            
                if ((State)Session["estado"] == State.Agregar)
                {
                    if (!empleadoService.Existe(MapFormToEmpleado()))
                    {
                        empleadoService.Insertar(MapFormToEmpleado());
                    }
                    else
                    {
                        Show("El empleado ingresado ya se encuentra registrado en el sistema");
                    }
                }
                else if ((State)Session["estado"] == State.Editar)
                {
                    empleadoService.Modificar(MapFormToEmpleado());
                }
            
            CargarGrilla();
        }

        private Empleado MapFormToEmpleado()
        {
            Empleado empleado = new Empleado();
            if (txtCodigo.Text != "")
                empleado.Id = int.Parse(txtCodigo.Text);
            
            empleado.Nombre = txtNombre.Text;
            empleado.NroDocumento = txtDocumento.Text;
            empleado.FechaAlta = DateTime.Parse(txtFechaAlta.Text);
            
            if(txtFechaNacimiento.Text != "")
            empleado.FechaNacimiento = DateTime.Parse(txtFechaNacimiento.Text);
            
            empleado.SueldoBasico = double.Parse(txtSueldoBasico.Text);
            empleado.Telefono = txtTelefono.Text;
            empleado.Email = txtEmail.Text;
            empleado.DadoBaja = false;
            empleado.Direccion = txtDireccion.Text;
            empleado.IdTipoDocumento = Convert.ToInt32(cmbTipoDocumento.SelectedValue);
            empleado.IdCiudad = Convert.ToInt32(cmdCiudad.SelectedValue);
            
            if (rbtMasculino.Checked)
                empleado.Masculino = true;
            
            else if (rbtFemenino.Checked)
                empleado.Masculino = false;

            else empleado.Masculino = null;

            return empleado;
        }

        private void MapEmpleadoToForm(Empleado empleado)
        {
            txtCodigo.Text = empleado.Id.ToString();
            txtDireccion.Text = empleado.Direccion;
            txtDocumento.Text = empleado.NroDocumento;
            txtEmail.Text = empleado.Email;
            txtFechaAlta.Text = empleado.FechaAlta.ToShortDateString();
            
            if(empleado.FechaNacimiento != DateTime.MinValue)
            txtFechaNacimiento.Text = empleado.FechaNacimiento.ToShortDateString();
            
            txtNombre.Text = empleado.Nombre;
            txtSueldoBasico.Text = empleado.SueldoBasico.ToString();
            txtTelefono.Text = empleado.Telefono;
            txtCantVentas.Text = empleado.CantidadVentas.ToString();
            cmbTipoDocumento.SelectedValue = empleado.IdTipoDocumento.ToString();
            //cmdCiudad.SelectedValue = empleado.IdCiudad.ToString();
            cmbProvinciaNacimiento.SelectedValue = empleado.GetCiudad().IdProvincia.ToString();

            if (empleado.Masculino == true)
            {
                rbtMasculino.Checked = true;
            }
            else if (empleado.Masculino == false)
            {
                rbtFemenino.Checked = true;
            }
        }


        private void HabilitarCampos()
        {
            txtDireccion.Enabled = true;
            txtDocumento.Enabled = true;
            txtEmail.Enabled = true;
            txtFechaNacimiento.Enabled = true;
            txtNombre.Enabled = true;
            txtSueldoBasico.Enabled = true;
            txtTelefono.Enabled = true;
            cmbTipoDocumento.Enabled = true;
            cmbProvinciaNacimiento.Enabled = true;
            rbtMasculino.Enabled = true;
            rbtFemenino.Enabled = true;
        }

        private void DeshabilitarCampos()
        {
            txtDireccion.Enabled = false;
            txtDocumento.Enabled = false;
            txtEmail.Enabled = false;
            txtFechaAlta.Enabled = false;
            txtFechaNacimiento.Enabled = false;
            txtNombre.Enabled = false;
            txtSueldoBasico.Enabled = false;
            txtTelefono.Enabled = false;
            cmbTipoDocumento.Enabled = false;
            cmdCiudad.Enabled = false;
            cmbProvinciaNacimiento.Enabled = false;
            rbtMasculino.Enabled = false;
            rbtFemenino.Enabled = false;
        }

        private void CargarGrilla()
        {
            List<EmpleadoReadOnly> empleados = empleadoService.ObtenerReadOnlies();
            CargarGrilla(empleados);
        }

        private void CargarGrilla(List<EmpleadoReadOnly> lista)
        {
            grdEmpleados.DataSource = null;
            grdEmpleados.DataSource = lista;
            string[] keys = new string[1];
            keys[0] = "Id";
            grdEmpleados.DataKeyNames = keys;
            grdEmpleados.DataBind();
            grdEmpleados.AutoGenerateSelectButton = true;

            //TODO Franco: ver como asignar nombres distintos a las columnas.
        }

        private void CargarCombos()
        {
            cmbProvinciaNacimiento.DataSource = provinciaService.ObtenerTodo();
            cmbProvinciaNacimiento.DataTextField = "Nombre";
            cmbProvinciaNacimiento.DataValueField = "Id";
            cmbProvinciaNacimiento.DataBind();
            cmbProvinciaNacimiento.Items.Insert(0, new ListItem("Seleccione...", "0")); 
            
            cmbTipoDocumento.DataSource = tipoDocumentoService.ObtenerTodo();
            cmbTipoDocumento.DataTextField = "Nombre";
            cmbTipoDocumento.DataValueField = "Id";
            cmbTipoDocumento.DataBind();
        }

        private void LimpiarCampos()
        {
            txtCodigo.Text = "";
            txtDireccion.Text = "";
            txtDocumento.Text = "";
            txtEmail.Text = "";
            txtFechaAlta.Text = "";
            txtFechaNacimiento.Text = "";
            txtNombre.Text = "";
            txtSueldoBasico.Text = "";
            txtTelefono.Text = "";
            txtCantVentas.Text = "";
            cmbTipoDocumento.ClearSelection();
            cmdCiudad.ClearSelection();
            cmbProvinciaNacimiento.ClearSelection();
            rbtMasculino.Checked = false;
            rbtFemenino.Checked = false;
        }

        private bool EsValido()
        {
            return true;
        }

        private static void Show(string message)
        {
            string cleanMessage = message.Replace("'", "\'");
            Page page = HttpContext.Current.CurrentHandler as Page;
            string script = string.Format("alert('{0}');", cleanMessage);
            if (page != null && !page.ClientScript.IsClientScriptBlockRegistered("alert"))
            {
                page.ClientScript.RegisterClientScriptBlock(page.GetType(), "alert", script, true);
            }
        }

        #endregion

        protected void cmdCiudad_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        protected void grdEmpleados_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
}